package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	race()
}

// race 函数模拟了一个比赛场景，10个选手等待一个信号开始比赛
func race() {
	// 创建一个条件变量和互斥锁
	cond := sync.NewCond(&sync.Mutex{})
	// 创建一个等待组，用于等待所有选手完成比赛
	var wg sync.WaitGroup
	// 初始化等待组，添加11个任务
	wg.Add(11)

	// 启动10个选手的goroutine
	for i := 0; i < 10; i++ {
		go func(num int) {
			// 选手完成后，将等待组计数器减一
			defer wg.Done()
			// 打印选手就位信息
			fmt.Println(num, "号已经就位")
			// 选手获取互斥锁，准备等待信号
			cond.L.Lock()
			// 选手等待条件变量的信号
			cond.Wait()
			// 打印选手开始工作的信息
			fmt.Println(num, "号已开始工作")
			// 选手释放互斥锁
			cond.L.Unlock()
		}(i)
	}

	// 等待2秒，模拟比赛准备时间
	time.Sleep(2 * time.Second)

	// 启动一个goroutine，用于发送比赛开始的信号
	go func() {
		// 完成后，将等待组计数器减一
		defer wg.Done()
		// 打印准备开始的信息
		fmt.Println("准备开始！")
		// 发送广播信号，通知所有等待的选手开始比赛
		cond.Broadcast()
	}()

	// 等待所有选手完成比赛
	wg.Wait()
}
